<?php

/**
 * notificacion actions.
 *
 * @package    ACATEC
 * @subpackage notificacion
 * @author     Acalio Innova
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class notificacionActions extends sfActions
{
  public function executeIndex(sfWebRequest $request)
  {

    $this->getUser()->setAttribute('current','notificacion');
    
    /* Creamos la consulta para obtener el idempresa, como solo hay una cojo la primera.
     * no tengo en consideración que esté relacionado con el nombre de usuario    
     */
    $q = Doctrine_Query::create()
            ->select('id')
            ->from('Empresa id');          
    $empresa_id = $q->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY);
    
    // Y el resultado lo guardamos en la vble de sesión.
    $this->getUser()->setAttribute('empresa_id', $empresa_id['id']);
    
    // Definimos la cultura del usuario por defecto
    //$this->getUser()->setCulture(sfConfig::get('app_culture_default','es'));
    $this->getUser()->setCulture('es');

    // sorting
    if ($request->getParameter('sort') && $this->isValidSortColumn($request->getParameter('sort')))
    {
      $this->setSort(array($request->getParameter('sort'), $request->getParameter('sort_type')));
    }

    // pager
    if ($request->getParameter('page'))
    {
      $this->setPage($request->getParameter('page'));
    }
    $this->pager = $this->getPager();
    $this->sort = $this->getSort();
    
    //Intento para filtros con formularios embebidos de symfony
    //$this->filter = new NotificacionFormFilter();
  }

  public function executeFilter(sfWebRequest $request)
  {
    $this->setPage(1);

    if ($request->hasParameter('_reset'))
    {
      $this->setFilters(array());
      $this->redirect('@notificacion');
    }

    $this->filters = new NotificacionFormFilter($this->getFilters());
    $this->filters->bind($request->getParameter($this->filters->getName()));
    if ($this->filters->isValid())
    {
      $this->setFilters($this->filters->getValues());
      $this->redirect('@notificacion');
    }

    $this->pager = $this->getPager();
    $this->sort = $this->getSort();

    $this->setTemplate('index');
  }
  
  public function executeActualizaBusquedaClienteId(sfWebRequest $request){
     $cliente_id=$request->getParameter('cliente_id');
     $this->cliente = Doctrine_Core::getTable('Contacto')->findOneById($cliente_id);
     
     $this->filters = new ContactoFormFilter($this->getFilters());
     $this->filters->bind($request->getParameter($this->filters->getName()));
     if ($this->filters->isValid())
     {
       $filters = $this->filters->getValues();
       $this->setFilters($filters);

     }
  }  
  
  public function executeNew(sfWebRequest $request)
  {
    /** NOTA DE MEJORA
  	    *****************************************************************************************
  	 En el modulo de inicio se inicializan las vbles de sesión.
  	 Debería controlarse de algún modo que estas vbles hayan sido creadas al llegar a este punto
  	 puesto que puede que el usuario no haya pasado por el punto inicial. **/

        $today = date("Y-m-d");
        $this->form = new NotificacionForm();
        $this->form->setDefault('fecha_creacion', $today);
        $this->form->setDefault('fecha_lanzamiento', $today);
        $this->cliente = NULL;       
	// Debo utilizar estos objetos
	//$this->notificacion = new Notificacion();

    //unset($this->form['propietario_id']);

    /*
    $this->form->setWidget('empresa_cli_id',  new sfWidgetFormDoctrineChoice(array(
                          'model' =>  'CrmEmpresaCli'    )));
    $this->form->setWidget('notificacion_categoria_id',  new sfWidgetFormDoctrineChoice(array(
                          'model' =>  'ContactoCategoria'    )));
    $tis->form->setWidget('publico', new sfWidgetFormInputCheckbox(array('value_attribute_value' => '1', 'default' => true)));
    */
    //$this->getUser()->setAttribute('crm_cliente',$this->cliente);

  }
  
  public function executeNewMail(sfWebRequest $request)
  {
        //Cojo el cliente
        $this->forward404Unless($this->cliente = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
        
        $today = date("Y-m-d");
        $this->form = new NotificacionForm();
        $this->form->setDefault('fecha_creacion', $today);
        $this->form->setDefault('fecha_lanzamiento', $today);
        /*$this->form = new NotificacionForm();
        $today = date("Y-m-d");
        //$this->form->setDefault('fecha_creacion', $today);
        $this->form->setDefault('fecha_lanzamiento', $today);
        $this->form->setWidget('email', new sfWidgetFormInput(array('default' => $contacto->getEmail()),
                                                                    array('readonly'=>'readonly')));
        $this->form->setWidget('contacto_id', new sfWidgetFormInputHidden(array('default' => $contacto->getId()),
                                                                    array('readonly'=>'readonly')));
        
        $this->form->setWidget('fecha_creacion', new sfWidgetFormInputHidden(array('default' => $today)));
	*/
	// Debo utilizar estos objetos
	//$this->notificacion = new Notificacion();

  }
  
  public function executeNewImpago(sfWebRequest $request)
  {
        //Cojo el cliente
        $this->forward404Unless($this->cliente = Doctrine_Core::getTable('Contacto')->find(array($request->getParameter('id'))), sprintf('Object contacto does not exist (%s).', $request->getParameter('id')));
        
        $today = date("Y-m-d");
        $this->form = new NotificacionForm();
        $this->form->setDefault('fecha_creacion', $today);
        $this->form->setDefault('fecha_lanzamiento', $today);
        
        //Leo el fichero de impagos según el idioma del cliente        
        $idioma = strtoupper($this->cliente->getIdioma());
        if ( $idioma == "SUECO"){
            $nombre_fichero_impago = sfConfig::get('app_email_txt_impago_SW');          
        }
        else {
            if ( $idioma == "INGLéS"){ //Al pasarlo a mayúsculas se convierte en INGLéS      
                    $nombre_fichero_impago = sfConfig::get('app_email_txt_impago_EN');          
            }    
            else{  //Por defecto supongo español
                $nombre_fichero_impago = sfConfig::get('app_email_txt_impago_ES');          
            }
        }          
        $fichero_impago = fopen ($nombre_fichero_impago, "r");

        //obtenemos de una sola vez todo el contenido del fichero
        //OJO! Debido a filesize(), sólo funcionará con archivos de texto        
        $texto_impago = fread($fichero_impago, filesize($nombre_fichero_impago));

        // Reemplazamos los comodines en el texto
        $texto_impago = str_replace("%nombre%", $this->cliente->getNombre(), $texto_impago);
        $texto_impago = str_replace("%primer_apellido%", $this->cliente->getPrimerApellido(), $texto_impago);
        $texto_impago = str_replace("%segundo_apellido%", $this->cliente->getSegundoApellido(), $texto_impago);
        $texto_impago = str_replace("%sexo%", $this->cliente->getSexo(), $texto_impago);
        $texto_impago = str_replace("%dni%", $this->cliente->getNumDocumento(), $texto_impago);
        $texto_impago = str_replace("%fecha_nacimiento%", $this->cliente->getFechaNac(), $texto_impago);
        $texto_impago = str_replace("%idioma%", $this->cliente->getIdioma(), $texto_impago);        
        
        $this->form->setDefault('texto', $texto_impago);
        /*$this->form = new NotificacionForm();
        $today = date("Y-m-d");
        //$this->form->setDefault('fecha_creacion', $today);
        $this->form->setDefault('fecha_lanzamiento', $today);
        $this->form->setWidget('email', new sfWidgetFormInput(array('default' => $contacto->getEmail()),
                                                                    array('readonly'=>'readonly')));
        $this->form->setWidget('contacto_id', new sfWidgetFormInputHidden(array('default' => $contacto->getId()),
                                                                    array('readonly'=>'readonly')));
        
        $this->form->setWidget('fecha_creacion', new sfWidgetFormInputHidden(array('default' => $today)));
	*/
	// Debo utilizar estos objetos
	//$this->notificacion = new Notificacion();

  }
  
  public function executeCreate(sfWebRequest $request)
  {
        $this->forward404Unless($request->isMethod(sfRequest::POST));        
        $this->form = new NotificacionForm();
    
        $this->processForm($request, $this->form);
        $this->setTemplate('new');
  }

  protected function enviaEmail(Notificacion $notificacion)
  {     
      $from = sfConfig::get('app_email_remiteMail');
      $nombre = sfConfig::get('app_email_remiteNombre');
      $to = $notificacion->getContacto()->getEmail();
      $toNombre = $notificacion->getContacto()->getNombre()." ".$notificacion->getContacto()->getPrimerApellido();
      $subject = $notificacion->getAsunto();
      
      //Añadimos el pie (firma y pie con LOPD) y el logotipo al envío
      //$imagen = sfConfig::get('app_email_logotipo');
      //$cabecera = "<div><img src=\"".$imagen."\" alt=\"Logotipo\" /></div>";     
      $nombre_fichero_firma = sfConfig::get('app_email_fichfirma');
      $fichero_texto = fopen ($nombre_fichero_firma, "r");
      
      //Leo el fichero de pie LOPD según el idioma del cliente
      $idioma = strtoupper($notificacion->getContacto()->getIdioma());
      if ( $idioma == "SUECO"){
          $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_SW');          
      }
      else {
          if ( $idioma == "INGLéS"){ //Al pasarlo a mayúsculas se convierte en INGLéS      
                $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_EN');          
          }    
          else{  //Por defecto supongo español
            $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_ES');          
          }
      }          
      $fichero_lopd = fopen ($nombre_fichero_lopd, "r");
      
      //obtenemos de una sola vez todo el contenido del fichero
      //OJO! Debido a filesize(), sólo funcionará con archivos de texto
      $pie = fread($fichero_texto, filesize($nombre_fichero_firma));
      $lopd = fread($fichero_lopd, filesize($nombre_fichero_lopd));            
      //$text = $cabecera.$notificacion->getTexto().$pie.$lopd;
      $text = $notificacion->getTexto().$pie.$lopd;
      
      $message = $this->getMailer()->compose();
      $message->setSubject($subject);
      $message->setTo(array ($to => $toNombre));
      $message->setFrom(array ($from => $nombre));
      $message->setBody($text, 'text/html');      
            
      // Añado los adjuntos si existen.
      if ($notificacion->getAdjunto1()!= NULL){
          $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments').$notificacion->getAdjunto1())
                  ->setFileName($notificacion->getAdjuntoOriginal1())); //cambiamos el nombre del adjunto. VER CUAL PONER, ANALISIS!!!
      }
      if ($notificacion->getAdjunto2()!= NULL){
          $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments').$notificacion->getAdjunto2())
                  ->setFileName($notificacion->getAdjuntoOriginal2()));
      }

      //Lo enviamos si es instantaneo, en lugar de encolarlo.
      $this->getMailer()->sendNextImmediately()->send($message);      
  }

  public function executeActualizaClienteId(sfWebRequest $request){
     $cliente_id=$request->getParameter('cliente_id');
     $this->cliente = Doctrine_Core::getTable('Contacto')->findOneById($cliente_id);
  }  
  
  public function executeEdit(sfWebRequest $request)
  {
    $this->forward404Unless($notificacion = Doctrine_Core::getTable('Notificacion')->find(array($request->getParameter('id'))), sprintf('Object notificacion does not exist (%s).', $request->getParameter('id')));
    $this->form = new NotificacionForm($notificacion);   
  }
  
  public function executeShow(sfWebRequest $request)
  {
    $this->forward404Unless($this->notificacion = Doctrine_Core::getTable('Notificacion')->find(array($request->getParameter('id'))), sprintf('Object notificacion does not exist (%s).', $request->getParameter('id')));
    $this->cliente = $this->notificacion->getContacto();    
    //Tomo la variable para poder mostrar el campo texto con formato html
    $this->texto = $this->notificacion->getTexto();      
            
  }
  
  public function executeUpdate(sfWebRequest $request)
  {
    
    $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT));
    $this->forward404Unless($notificacion = Doctrine_Core::getTable('Notificacion')->find(array($request->getParameter('id'))), sprintf('Object notificacion does not exist (%s).', $request->getParameter('id')));
    $this->form = new NotificacionForm($notificacion);
    $this->processForm($request, $this->form);

    $this->setTemplate('edit');
  }

   
  /*
   * Este método elimina un notificacion, solo si este no tiene documentos asociados (partes, presupuestos o facturas)
   * En caso contrario, lo marca para que no se muestre, pero seguirá en la BD.
   */
  public function executeDelete(sfWebRequest $request)
  {
    $request->checkCSRFProtection();
    $this->forward404Unless($notificacion = Doctrine_Core::getTable('Notificacion')->find(array($request->getParameter('id'))), sprintf('Object notificacion does not exist (%s).', $request->getParameter('id')));
    $notificacion->delete();
    
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Notificacion eliminada.'));
    $this->redirect('notificacion/index');
  }

  public function executeImprimir(sfWebRequest $request)
  {
  	// Recogemos los datos de la notificacion
  	$this->forward404Unless($notificacion = Doctrine_Core::getTable('Notificacion')->find(array($request->getParameter('id'))), sprintf('Object crm_vehiculo does not exist (%s).', $request->getParameter('id')));
  	
  	
  	//Cargamos los datos del pdf
  	$config = sfTCPDFPluginConfigHandler::loadConfig();
  	// pdf object
  	$pdf = new sfTCPDF();
  	
  	// Variables para generar el documento pdf
  	$titulo = sfContext::getInstance()->getI18n()->__('Datos de la Notificacion'); 
  	$nombre= $notificacion->getAsunto();
  	$hoy = $this->getUser()->getAttribute('hoy','Lunes');
  	
  	$saltoEncabezado = PDF_HEADER_STRING; 
  	//$nombre=strtoupper($nombre);
  	// set document information
  	$pdf->SetCreator(PDF_CREATOR);
  	$pdf->SetAuthor(PDF_AUTHOR);
  	$pdf->SetTitle($titulo);
  	$pdf->SetSubject($nombre);
  	$pdf->SetKeywords('acalio, innova, acatec, crm, desarrollo');
  	
  	
  	// set default header data
  	//$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING);
  	$pdf->SetHeaderData('../../../../../web/'.sfConfig::get('pdf_imagenlogo'), PDF_HEADER_LOGO_WIDTH, 
  	         $titulo, $nombre.$saltoEncabezado.$hoy);
  	
  	// set header and footer fonts
  	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
  	$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
  	
  	// set default monospaced font
  	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  	
  	//set margins
  	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
  	$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
  	$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
  	
  	//set auto page breaks
  	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
  	
  	//set image scale factor
  	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  	
  	// ---------------------------------------------------------
  	
  	// set default font subsetting mode
  	$pdf->setFontSubsetting(true);
  	
  	// Set font
  	// dejavusans is a UTF-8 Unicode font, if you only need to
  	// print standard ASCII chars, you can use core fonts like
  	// helvetica or times to reduce file size.
  	$pdf->SetFont('dejavusans', '', 8, '', true);
    
  	// Add a page
  	// This method has several options, check the source code documentation for more information.
  	$pdf->AddPage();
  	
  	// Set some content to print
        $html = $notificacion->getContacto()->imprimeToPdf();
        $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);
  	
        $html = $notificacion->imprimeToPdf();
        $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $html, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);        
        
        // ---------------------------------------------------------
        // Modificación FEBRERO 2013, Incluyo el pie y la LOPD en la impresión de las notificaciones.
  	//Obtengo el fichero con el html de la firma
        $nombre_fichero = sfConfig::get('app_email_fichfirmaCarta');
        $fichero_texto = fopen ($nombre_fichero, "r");
        
        //obtenemos de una sola vez todo el contenido del fichero
        //OJO! Debido a filesize(), sólo funcionará con archivos de texto
        $pie = fread($fichero_texto, filesize($nombre_fichero));
        // Firma
        $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $pie, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);
            
        //Escribo el pie LOPD
        //Leo el fichero de pie LOPD según el idioma del cliente
        $idioma = strtoupper($notificacion->getContacto()->getIdioma());
        if ( $idioma == "SUECO"){
             $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_SW_Carta');          
        }
        else {
             if ( $idioma == "INGLéS"){ //Al pasarlo a mayúsculas se convierte en INGLéS       
                  $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_EN_Carta');          
             }    
             else{ //Por defecto supongo español
                  $nombre_fichero_lopd = sfConfig::get('app_email_fichpie_ES_Carta');          
             }
        }          
        $fichero_lopd = fopen ($nombre_fichero_lopd, "r");
        $lopd = fread($fichero_lopd, filesize($nombre_fichero_lopd)); 
        $pdf->writeHTMLCell($w=0, $h=0, $x='', $y='', $lopd, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);                    
                
  	// Close and output PDF document
  	// This method has several options, check the source code documentation for more information.
  	$pdf->Output($nombre.'.pdf', 'I');
  	// Stop symfony process
  	throw new sfStopException();
  	
  }
  
  protected function imprimeNotificacion(Notificacion $notificacion){
  	sfContext::getInstance()->getConfiguration()->loadHelpers('Date');
  	$html= '<div>'.
  	'<h2> Datos del notificacion AQUI NOTIFICACION l.419</h2>'.
  	'<span style="font-weight: bold;">Nombre: </span>'.
  	'<span>'.$cliente->getNombre().' '.$cliente->getApellidos().'</span><br />'.
  	'<span style="font-weight: bold;">DNI: </span>'.
  	'<span>'.$notificacion->getDni().'</span><br />'.
  	'<span style="font-weight: bold;">Dirección: </span>'.
  	'<span>'.$cliente->getDomicilio().' ('.$cliente->getPoblacion().')</span><br />';
  	
        //Imprimo la lista de telefonos
        $numtel = 1;
        foreach ($cliente->getNotificacionTelefono() as $telefono){        
            $html= $html.'<span style="font-weight: bold;">Telefono '.$numtel.': </span>'.
            '<span>'.$telefono->getTelefono().' - '. $telefono->getTipo().'</span><br />';            
            $numtel++;
        }        
        
        $numemail = 1;
        //Imprimo la lista de emails
        foreach ($cliente->getNotificacionEmail() as $email){        
            $html= $html.'<span style="font-weight: bold;">Email '.$numemail.': </span>'.
            '<span>'.$email->getEmail().' - '. $email->getTipo().'</span><br />';            
            $numemail++;
        }        
        
        $html= $html.
        '<span style="font-weight: bold;">Fecha de nacimiento: </span>'.                
  	'<span>'.$cliente->getFechaNac().'</span><br />'.
  	'<span style="font-weight: bold;">Web: </span>'.
  	'<span>'.$cliente->getWebPersonal().'</span><br />'.
  	'<span style="font-weight: bold;">Descripción: </span>'.
  	'<span>'.$cliente->getDescripcion().'</span><br />'.
  	'</div>';
  	return $html;
  }
  
     
  public function executeBatch(sfWebRequest $request)
  {
    $request->checkCSRFProtection();
    if (!$action = $request->getParameter('batch_action'))
    {
      $this->getUser()->setFlash('error', sfContext::getInstance()->getI18n()->__('You must select an action to execute on the selected items.'));
      $this->redirect('@notificacion');
    }
    if (!$ids = $request->getParameter('ids'))
    {
      if ($action == 'batchPrint')  // Le hemos dado a imprimir pero sin seleccionar nada. IMPRIMIR TODO
      {
    	if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    	{
        	throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    	}
    	// execute batch executeBachPrint sin ids
      	$this->$method($request);
      }
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('You must at least select one item.'));

      $this->redirect('@notificacion');
    }

    if (!method_exists($this, $method = 'execute'.ucfirst($action)))
    {
      throw new InvalidArgumentException(sprintf('You must create a "%s" method for action "%s"', $method, $action));
    }

    $validator = new sfValidatorDoctrineChoice(array('multiple' => true, 'model' => 'Notificacion'));
    try
    {
      // validate ids
      $ids = $validator->clean($ids);

      // execute batch
      $this->$method($request);
    }
    catch (sfValidatorError $e)
    {
      $this->getUser()->setFlash('error',sfContext::getInstance()->getI18n()->__('A problem occurs when deleting the selected items as some items do not exist anymore.'));
    }

    $this->redirect('@notificacion');
  }
  
  protected function executeBatchDelete(sfWebRequest $request)
  {
    $ids = $request->getParameter('ids');
    $records = Doctrine_Query::create()
      ->from('Notificacion')
      ->whereIn('id', $ids)
      ->execute();
    foreach ($records as $notificacion){
        $notificacion->delete();
    }
    $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('Las notificaciones marcadas han sido eliminadas.'));
    $this->redirect('@notificacion');
  }
  
  protected function executeBatchPrint(sfWebRequest $request)
  {

	if (!$ids = $request->getParameter('ids')){  
                // Imprime los que pertenezcan al filtro
                $records = $this->buildQuery()->execute();
	} else {   // imprime solo los ids selecionados
		$records = Doctrine_Query::create()
                            ->from('Notificacion')
                            ->whereIn('id', $ids)
                            ->execute();
	}

    	//Cargamos los datos del pdf
	$config = sfTCPDFPluginConfigHandler::loadConfig();
	// pdf object
	$pdf = new sfTCPDF();
	 
	// Variables para generar el documento pdf
	$titulo = sfContext::getInstance()->getI18n()->__('Lista de Notificacions');
	$hoy = $this->getUser()->getAttribute('hoy','Lunes');
	 
	$saltoEncabezado = PDF_HEADER_STRING;
	// set document information
	$pdf->SetCreator(PDF_CREATOR);
	$pdf->SetAuthor(PDF_AUTHOR);
	$pdf->SetTitle($titulo);
	$pdf->SetSubject($titulo);
	$pdf->SetKeywords('acalio, innova, acatec, crm, desarrollo');
	 
	 
	// set default header data
	$pdf->SetHeaderData('../../../../../web/'.sfConfig::get('pdf_imagenlogo'), PDF_HEADER_LOGO_WIDTH,
	$titulo, $saltoEncabezado.$hoy);
	 
	// set header and footer fonts
	$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
	$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
	 
	// set default monospaced font
	$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
	 
	//set margins
	$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
	$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
	$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
	 
	//set auto page breaks
	$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
	 
	//set image scale factor
	$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
	 
	// ---------------------------------------------------------
	 
	// set default font subsetting mode
	$pdf->setFontSubsetting(true);
	 
	// Set font
	// dejavusans is a UTF-8 Unicode font, if you only need to
	// print standard ASCII chars, you can use core fonts like
	// helvetica or times to reduce file size.
	$pdf->SetFont('dejavusans', '', 8, '', true);
	 
		 
	// Add a page
	// This method has several options, check the source code documentation for more information.
	$pdf->AddPage('L', 'A4');
	 
	// Set some content to print
	
	
        $thml = $records->getFirst()->imprimeTablaNotificacionesToPdf($records);

        // Print text using writeHTMLCell()
        $pdf->writeHTML($thml, true, false, false, false, '');

        // ---------------------------------------------------------
	 
	// Close and output PDF document
	// This method has several options, check the source code documentation for more information.
	$pdf->Output($titulo.'.pdf', 'I');
	// Stop symfony process
	throw new sfStopException();
  }
 
  protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

    if ($form->isValid())
    { 
      $notificacion = $form->save();
      //Añado los nombres originales de los adjuntos
      $notificacion->setAdjuntoOriginal1($_FILES['notificacion']['name']['adjunto1']); //FILES[notificacion][name][adjunto1]
      $notificacion->setAdjuntoOriginal2($_FILES['notificacion']['name']['adjunto2']);
      $notificacion->save();
      
      // Envío el mail de momento de forma instantánea si la fecha de lanzamiento es hoy.
      $today = date("Y-m-d");
      
      if ($notificacion->getFechaLanzamiento() == $today){        
        $this->enviaEmail($notificacion);        
        //Lo marco como enviado
        $notificacion->is_validated= TRUE;
        $notificacion->save();        
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La notificacion ha sido enviada'));
      }  
      else{
        $this->getUser()->setFlash('notice', sfContext::getInstance()->getI18n()->__('La notificacion ha sido guardada'));
      }
      $this->redirect('notificacion/index');
    }
  }

  protected function getFilters()
  {
    return $this->getUser()->getAttribute('notificacion.filters');
  }

  protected function setFilters(array $filters)
  {
    return $this->getUser()->setAttribute('notificacion.filters', $filters);
  }

  protected function getPager()
  {
    //Obtengo el número de notificacions a mostrar de la base de datos (tabla CrmConfiguracion)
    // PASAR A TODOS LO MÓDULOS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!   
    $campo = "numRegistros";
    $q = Doctrine_Query::create()
    ->select('valor')
    ->from('Configuracion c1')
    ->where('c1.campo = ?',$campo);
    $numelementos = $q->fetchOne(array(), Doctrine_Core::HYDRATE_SINGLE_SCALAR);
      
    $pager = new sfDoctrinePager('Notificacion', $numelementos);      
    // Ya no lo hacemos por la configuración de symfony, para que el usuario pueda modificarlo.  
    //$pager = new sfDoctrinePager('Notificacion', sfConfig::get('app_list_max_notificacions'));
    $pager->setQuery($this->buildQuery());
    $pager->setPage($this->getPage());
    $pager->init();

    return $pager;
  }

  protected function setPage($page)
  {
    $this->getUser()->setAttribute('notificacion.page', $page);
  }

  protected function getPage()
  {
    return $this->getUser()->getAttribute('notificacion.page', 1);
  }

  protected function buildQuery()
  {
    $tableMethod = 'Notificacion';
    $filterValues = $this->getFilters();
    $this->valores = $filterValues;
    $borrado = 1;
    //create a default query donde no muestro los marcados para borrar
    $query = Doctrine_Core::getTable('Notificacion')->createQuery('p')->where('p.remove_it <> ?',$borrado)
            ->orWhere('p.remove_it IS NULL');//->andWhere('p.notificacion_categoria_id = 2');
    
    if (null === $this->filtro)
    {
      $this->filtro = new NotificacionFormFilter($filterValues);
    }

    //if the form have been submited
    if($filterValues){
      //bind the values
      $this->filtro->bind($filterValues);
      //if valid, specialise the request using the form
      if($this->filtro->isValid())
         $query = $this->filtro->getQuery();
         //Añado condiciones para que en las búsquedas no se muestren los elementos marcados para borrado
         $query->andWhere($query->getRootAlias().'.remove_it IS NULL OR '.$query->getRootAlias().'.remove_it <> ?',$borrado);
    }    //$query->andWhere($query->getRootAlias().'.notificacion_categoria_id = 2');

    $this->addSortQuery($query);

    $event = $this->dispatcher->filter(new sfEvent($this, 'crm.build_query'), $query);
    $query = $event->getReturnValue();

    return $query;
  }

  protected function addSortQuery($query)
  {
    if (array(null, null) == ($sort = $this->getSort()))
    {
      return;
    }

    if (!in_array(strtolower($sort[1]), array('asc', 'desc')))
    {
      $sort[1] = 'asc';
    }

    $query->addOrderBy($sort[0] . ' ' . $sort[1]);
  }

  protected function getSort()
  {
    if (null !== $sort = $this->getUser()->getAttribute('notificacion.sort'))
    {
      return $sort;
    }

    $this->setSort(array('id',sfConfig::get('app_sort_default','asc')));

    return $this->getUser()->getAttribute('notificacion.sort');
  }

  protected function setSort(array $sort)
  {
    if (null !== $sort[0] && null === $sort[1])
    {
      $sort[1] = 'asc';
    }

    $this->getUser()->setAttribute('notificacion.sort', $sort);
  }

  protected function isValidSortColumn($column)
  {
    return Doctrine_Core::getTable('Notificacion')->hasColumn($column);
  }

  /*
   * Método que encola las notificaciones para enviar ese día que aún no se han enviado
   * y las marca como enviadas, para que no se vuelvan a encolar.
   * Realmente se hace como una tarea, por lo que este método no llega a usarse
   */
  public function executeEncolaEmails()
  {   $today = date("Y-m-d");  
      //Obtenemos los emails que deben enviarse hoy y no se han enviado aún.
      $notificaciones = Doctrine_Query::create()
                        ->from('Notificacion n1')
                        ->where('n1.fecha_lanzamiento = ?',$today)
                        ->andWhere('n1.is_validated != 1')
                        ->execute();
      
      $from = sfConfig::get('app_email_remiteMail');
      $nombre = sfConfig::get('app_email_remiteNombre');
      
      foreach ($notificaciones as $notificacion){
            $to = $notificacion->getContacto()->getEmail();            
            $toNombre = $notificacion->getContacto()->getNombre()." ".$notificacion->getContacto()->getPrimerApellido();
            $subject = $notificacion->getAsunto();
            $text = $notificacion->getTexto();
            //Creo el mailer con los datos
            $message = $this->getMailer()->compose();
            $message->setSubject($subject);
            $message->setTo(array ($to => $toNombre));
            $message->setFrom(array ($from => $nombre));
            $message->setBody($text, 'text/html');  
      
            // Añado los adjuntos si existen.
            if ($notificacion->getAdjunto1()!= NULL){
                $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments').$notificacion->getAdjunto1())
                        ->setFileName($notificacion->getAdjuntoOriginal1())); //cambiamos el nombre del adjunto. VER CUAL PONER, ANALISIS!!!
            }
            if ($notificacion->getAdjunto2()!= NULL){
                $message->attach(Swift_Attachment::fromPath(sfConfig::get('app_email_attachments').$notificacion->getAdjunto2())
                        ->setFileName($notificacion->getAdjuntoOriginal2()));
            }
            //Lo encolamos.
            $this->getMailer()->send($message);      
            //Lo marcamos como enviado (aunque realmente aún no se ha enviado)
            $notificacion->is_validated= TRUE;
            $notificacion->save(); 
      } 
      
      $this->redirect('notificacion/index');
  }
  
  // Método para agregar un adjunto vacío en el formulario.
  /*
   * Funcionaba cuando se hacían los adjuntos con formularios embebidos,
   * con la técnica actual no es necesario
   */
   public function executeAddAdjunto(sfWebRequest $request){
      $this->forward404unless($request->isXmlHttpRequest());
      $number = intval($request->getParameter("num"));

      $this->form = new NotificacionForm();

      $this->form->addNewFields($number);

      return $this->renderPartial('addNew',array('form' => $this->form, 'number' => $number));
    }

}
